package com.hp;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 实现stack模板
 *
 * 栈是一种基于后进先出（LIFO)策略的线性数据结构。
 * 这就像手枪弹夹一样，先填进去的子弹都打出，后填进去的子弹后打出。
 * 该模板只有5个方法，分别是isEmpty(),size(),top(),pop(),push(T).
 * 代码如下:
 */
public class Stack<Item> {
    private Node first;
    private int N;

    private class Node {
        Item item;
        Node next;
    }

    public boolean isEmpty() {                        //判断是否为空
        return first == null;
    }

    public int size() {                                //栈的大小
        return N;
    }

    public void push(Item item) {                    //添加元素
        Node oldfirst = first;
        first = new Node();
        first.item = item;
        first.next = oldfirst;
        N++;
    }

    public Item pop() {                              //弹出元素
        Item item = first.item;
        first = first.next;
        N--;
        return item;
    }

    public Item top() {        //访问栈顶元素
        return first.item;
    }

    public static void main(String[] args) {
        Stack<Integer> te = new Stack<Integer>();
        te.push(19);
        if (te.isEmpty()) {
            System.out.println("isEmpty!");
        } else
            System.out.println("Not Empty!");
        te.push(20);
        System.out.println(te.pop());
        System.out.println(te.top());
        System.out.println(te.pop());
        if (te.isEmpty()) {
            System.out.println("isEmpty!");
        } else
            System.out.println("Not Empty!");

        List<Object> list = new ArrayList<>();

        Collections.sort(list, new Comparator<Object>() {
            @Override
            public int compare(Object o1, Object o2) {
                return 0;
            }
        });
    }






}